package org.itstack.demo.design;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: gs
 * @Date: 2024/9/3 21:43
 * @Version: v1.0.0
 * @Description: TODO
 **/
public class DecrationPackageMenu implements IMenu {

    Logger logger = LoggerFactory.getLogger(DecrationPackageMenu.class);
    private List<Matter> list = new ArrayList<Matter>();

    private BigDecimal price = BigDecimal.ZERO;

    private BigDecimal area;    //装修面积
    private String grade;   //装修等级

    private DecrationPackageMenu(){

    }

    public DecrationPackageMenu(Double area, String grade){
        this.area = new BigDecimal(area);
        this.grade = grade;
    }

    /**
     * new BigDecimal("0.2")：这里创建了一个新的BigDecimal实例，表示数字0.2
     * area.multiply(new BigDecimal("0.2"))：这部分代码将area与0.2相乘，得到的结果可能是计算了某种折扣或税率后的价格部分。
     * .multiply(matter.price())：接着，将上一步的结果与matter.price()返回的价格相乘，这可能是为了计算最终的价格，考虑到了每单位面积的成本。
     * price.add(...)：最后，将计算得到的值加到原始的price上。这表示在基础价格上加上了额外的费用或折扣。
     * **/
    public IMenu appendCeiling(Matter matter){
        logger.info("====吊顶===={}",matter);
        list.add(matter);
        price = price.add(area.multiply(new BigDecimal("0.2")).multiply(matter.price()));
        logger.info("price:{}",price);
        return this;
        /*
        * 链式调用（Fluent Interface）：
        * return this; 允许方法返回当前对象的引用，这使得可以进行链式调用。
        * 链式调用是一种方法调用的链，其中每个方法调用返回对象本身，允许你在一个表达式中连续调用多个方法。
        * */
    }

    public IMenu appendCoat(Matter matter){
        logger.info("====涂料===={}",matter);
        list.add(matter);
        price = price.add(area.multiply(new BigDecimal("1.4")).multiply(matter.price()));
        logger.info("price:{}",price);
        return this;
    }

    public IMenu appendFloor(Matter matter){
        logger.info("====地板===={}",matter);
        list.add(matter);
        price = price.add(area.multiply(matter.price()));
        logger.info("price:{}",price);
        return this;
    }

    public IMenu appendTile(Matter matter){
        logger.info("====地砖===={}",matter);
        list.add(matter);
        price = price.add(area.multiply(matter.price()));
        logger.info("price:{}",price);
        return this;
    }

    public String getDetail(){

        StringBuilder detail = new StringBuilder("\r\n-------------------------------------------------------\r\n" +
                "装修清单" + "\r\n" +
                "套餐等级：" + grade + "\r\n" +
                "套餐价格：" + price.setScale(2, BigDecimal.ROUND_HALF_UP) + " 元\r\n" +
                "房屋面积：" + area.doubleValue() + " 平米\r\n" +
                "材料清单：\r\n");

        for ( Matter matter: list) {
            detail.append(matter.scene()).append(";").append(matter.brand()).append("、").
                    append(matter.model()).append("、平米价格：").append(matter.price()).append("元。");
        }

        return  detail.toString();
    }
}
